package com.itheima.tlias.service.impl;


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.tlias.ExcelUtils.DemoDataListener;
import com.itheima.tlias.mapper.StudentMapper;
import com.itheima.tlias.pojo.*;
import com.itheima.tlias.service.StudentService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.List;

/**
 * TODO
 *
 * @Author mr.luo
 * @Date 06 4月 2025 17:32
 */
@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentMapper studentMapper;

    /**
     * 分页查询
     *
     * @param studentDTO
     * @return
     */
    @Override
    public PageResult<StudentVo> pageQuery(StudentDTO studentDTO) {
        PageHelper.startPage(studentDTO.getPage(), studentDTO.getPageSize());
        Page<StudentVo> page = studentMapper.pageQuery(studentDTO);
        PageResult<StudentVo> pageResult = new PageResult<>(page.getTotal(), page.getResult());
        return pageResult;
    }

    /**
     * 批量删除
     *
     * @param ids
     */
    @Override
    public void batchDelete(List<Integer> ids) {
        studentMapper.batchDelete(ids);
    }

    /**
     * 添加学员信息
     *
     * @param addStudentDTO
     */
    @Override
    public void add(AddStudentDTO addStudentDTO) {
        addStudentDTO.setCreateTime(LocalDateTime.now());
        addStudentDTO.setUpdateTime(LocalDateTime.now());
        studentMapper.add(addStudentDTO);
    }

    /**
     * 根据id查询学员信息
     *
     * @param id
     * @return
     */
    @Override
    public StudentVo findById(Integer id) {
        StudentVo studentVo = studentMapper.selectStudentById(id);
        return studentVo;
    }

    /**
     * 更新学员信息
     *
     * @param studentVO
     */
    @Override
    public void update(StudentVo studentVO) {
        studentVO.setUpdateTime(LocalDateTime.now());
        studentMapper.update(studentVO);
    }

    /**
     * 学员违纪
     *
     * @param id
     * @param score
     */
    @Override
    public void violation(Integer id, Integer score) {
        // 更新违纪次数和违纪分数
        studentMapper.updateViolationCountAndScore(id, score);
    }

    /**
     * 批量导入学员信息
     *
     * @param file
     * @param clazzId
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void importStudent(MultipartFile file, Integer clazzId) throws IOException {
        //使用easyExcel解析导入Excel文件
        // 写法1：JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        InputStream is = file.getInputStream();
        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
        DemoDataListener demoDataListener = new DemoDataListener(studentMapper, clazzId);

        EasyExcel.read(is, Student.class, demoDataListener)
                .sheet(0) // 读取第一个sheet
                .headRowNumber(1)  // 设置标题行数
                .doRead();
    }


    /**
     * 导出学员信息
     */
    @Override
    public void exportExcel(HttpServletResponse response,Integer clazzId,String name,Integer degree) throws IOException {
        List<Student> students = studentMapper.exportExcel( clazzId, name, degree);
        // 注意 simpleWrite在数据量不大的情况下可以使用（5000以内，具体也要看实际情况），数据量大参照 重复多次写入
        // 写法1 JDK8+
        // since: 3.0.0-beta1
        // 设置响应头
//        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//        response.setCharacterEncoding("utf-8");
//        String fileName = URLEncoder.encode("学生数据.xlsx", "UTF-8").replaceAll("\\+", "%20");
//        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(response.getOutputStream(), Student.class) // 这里注意 如果同一个sheet只要创建一次
                .head(Student.class)// 设置表头
                .excelType(ExcelTypeEnum.XLSX)// 设置文件类型
                .sheet("导出学生数据")// 设置sheet名
                .doWrite(students);// 这里放入需要导出的数据
    }
}




